home *** CD-ROM | disk | FTP | other *** search
- Programming PC DMA Controller (8237)
- Josh Cohen
- CSC 390 Special Topics
- H. Barada
-
- The process, described in detail later, for programming DMA
- transfers is somewhat complex.
-
- General Steps:
-
- Set up a buffer to read from or write to.
- Disable the channel you wish to set up.
- Set the Page Register to the page which you want to transfer.
- Clear the Byte Pointer.
- Set Base Address register to the address of the beginning of the buffer.
- Set the Base Word Count register to number of words you wish to transfer.
- Set the DMA transfer Mode.
- Enable DMA channel to start transfer.
-
- Details
-
- Registers of the 8237 DMA controller
- The DMA controller has several channels. Channel 1 is best for
- user transfers as some others are used by the system.
-
- Address Description
- 00Ah Channel mask (enable/disable)
- 083h Page Register
- 00Ch Clear Byte pointer flipflop
- 002h Base Address 16 bit register
- 003h Base Word count 16 bit register
- 00Bh Transfer mode register
-
- To set up DMA controller
-
- Set up a buffer to read from or write to.
- Since the DMA controller does everything in 64k blocks, it is best to
- try to align the buffer to the segment edge, I.e. Segment A offset 0.
- This can be difficult depending on the language which we use.
-
- Disable the channel you wish to set up.
- If we use channel 1 we send 05h to address 00A (page register)
-
- Set the Page Register 00A to the page which you want to transfer.
- The pages are 64k blocks in main memory. We must setup multiple
- transfers if we wish to transfer more than 64k since the controller is
- only able to do 64k at a time.
- The pages are 00h to FFh starting with 0000-FFFF. Notice that these are
- the same pages that we call segments. When we specify addresses we are
- only talking about the offsets from the segment, not the entire address.
-
- Clear the Byte Pointer.
- The clear byte pointer register is a flip flop. Writing to the register
- clears it, the actual data which we write is ignored.
- Write any value to 00Ch
-
- Set Base Address register to the address of the beginning of the buffer.
- To do this we write the offset from the segment edge of the starting
- address of our buffer, this will be 0 if we have aligned the buffer to
- the segment edge.
- Write this offset to 002h
-
- Set the Base Word Count register to number of words you wish to transfer.
- This register gets the number of words which we wish to transfer.
- Usually this will be bytes.
- Write this number to 003h
-
- Set the DMA transfer Mode.
- This register controls the mode of transfer, it will vary upon the
- device which we want to transfer to. In our case, using the
- ThunderBoard Sound Card the possible modes are:
- 49h Non-continuous playback
- 59h Continuous playback
- 45h Non-continous record
- 55h Continuous record
- By playback we mean transfer data from memory out to the card
- By record we mean transfer data from the card to memory.
- Notice that we are sending out or receiving data from the bus. The
- computer really does not care or know where the data is going or coming
- from. We must also set up the device we are transferring with. In this
- case it is the ThunderBoard. See the next document on how to do that.
-
- Enable DMA channel to start transfer.
- Now that we have correctly set up the DMA controller for the transfer,
- we can enble the channel. However, we must set up the card to receive
- or send the data first. Usually, in practice, the card is set up before
- the DMA controller.
-
-